<?php
App::uses('AppController', 'Controller');

class RiportokController extends AppController {

	public $scaffold;
	public $uses = array('Riport', 'Bizonylat', 'Terv');
	public $components = array('RequestHandler', 'Igazgatosag', 'Cegosztaly');
	public $helpers = array('PhpExcelRrd');

	function isAuthorized(){
		if(in_array($this->Auth->user('csoport'), array(1,2,3,4))){		//admin jogosultságú júzerek
			return true;
		}
		return false;
	}
	
/*	function beforeFilter(){
		parent::beforeFilter();
		//xlsx kezelés hozzáadása
		if($this->RequestHandler->ext == 'xlsx'){
			$this->RequestHandler->setContent('xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		}
	}*/
	
	public function beszamolo(){
		$this->set('utsoLezart', $this->Bizonylat->getLastLezart(array('cegId' => $this->Session->read('Settings.cegId'),
																'ev' => $this->Session->read('Settings.ev'))));
		$this->set('terv', $this->_beszamolo('terv'));
		$this->set('teny', $this->_beszamolo('teny'));
	}

/*
 *
 *@param string $type a beszámoló típusa
 *						terv, teny, teny_terv
*/
	public function _beszamolo($type){
		if($this->request->data){
			$beszamoloRiportId = 1;	//TODO HC
			$riportsorok = $this->Riport->Riportsor->getSorokFor($beszamoloRiportId);	
			//debug($riportsorok);
			/*
			array(0=>array(
			'Riportsor' => array(
				'id' => '1',
				'riport_id' => '1',
				'sorszam' => '1',
				'megnevezes' => 'Értékesítés bevétele',
				'params' => 's:52:"{"szamlaTartomany" : "91*",
								"elojelforditas" : true}";'
								//"osszesito":true
			)
			*/
			//$this->set('riportsorok', $riportsorok);
			$r = array('riportsorok' => $riportsorok);
			
			set_time_limit(300);	//5 perc után a webszerver így is úgy is lelövi a folyamatot
	
			$this->request->data['Riport']['hotol'] = $this->request->data['Riport']['hotol'] ? $this->request->data['Riport']['hotol'] : 1;
			$this->request->data['Riport']['hoig'] = $this->request->data['Riport']['hoig'] ? $this->request->data['Riport']['hoig'] : $this->request->data['Riport']['hotol'];
	
			$honapField = ($type == 'teny') ? ' MONTH(datum) ' : ' ho ';
			$honap = 'AND '.$honapField.' >= ' . $this->request->data['Riport']['hotol'];
			$honap .= ' AND '.$honapField.' <= ' . $this->request->data['Riport']['hoig'];
			//$this->set('honapok', range($this->request->data['Riport']['hotol'], $this->request->data['Riport']['hoig']));
			$r['honapok'] = range($this->request->data['Riport']['hotol'], $this->request->data['Riport']['hoig']);
	
			if(isset($this->request->data['Riport']['osztalytol'])){
				$osztalytol =  substr($this->request->data['Riport']['osztalytol'], 0, strpos($this->request->data['Riport']['osztalytol'], ' '));
			}
			else{
				$osztalytol = $this->Bizonylat->Osztaly->find('first',
									array(
										'conditions' => array(
																'Osztaly.ev' => $this->Session->read('Settings.ev'),
																'GyujtoOsztaly.gyujto_id' => $this->Session->read('Settings.cegId')
																)
									)
							  );
				$osztalytol = $osztalytol['Osztaly']['kod'];
				$utsoOsztalyig = true;
			}
			if($this->request->data['Riport']['osztalyig']){
				$osztalyig = substr($this->request->data['Riport']['osztalyig'], 0, strpos($this->request->data['Riport']['osztalyig'], ' '));
			}
			elseif(isset($utsoOsztalyig)){
				$osztalyig = $this->Bizonylat->Osztaly->find('first',
									array(
										'conditions' => array(
																'Osztaly.ev' => $this->Session->read('Settings.ev'),
																'GyujtoOsztaly.gyujto_id' => $this->Session->read('Settings.cegId')
																),
										'order' => 'Osztaly.kod DESC'
									)
							  );
				$osztalyig = $osztalyig['Osztaly']['kod'];
			}
			else{
				$osztalyig = $osztalytol;
			}
			
			//gyüjtő
			$gyujtoTabla = '';
			/* iisue224
			 *if($this->request->data['_Tetel']['gyujto']){
				$gyujtoTabla = ', gyujtok_tetelek';
				$gyujto = ' AND gyujtok_tetelek.tetel_id = tetelek.id
								AND gyujtok_tetelek.gyujto_id = ' . intval($this->request->data['_Tetel']['gyujto']);
			}*/
	
			$beszamolo = $elojelForditas = $beszamoloSorok = array();
			foreach($riportsorok as $riportsor){
				$params = json_decode(unserialize($riportsor['Riportsor']['params']));
				if(isset($params->szamlaTartomany)){
					App::uses('SzamlaSzamSQL', 'Utility');
					$szamlaSzamSQL = new SzamlaSzamSQL();
					$szamlaTartomany = ($type == 'teny') ? $szamlaSzamSQL->createSzamlaTartomanySql($params->szamlaTartomany) : null;
					if($type == 'teny'){
						$sql = 'SELECT osztalyok.id AS osztalyId, osztalyok.kod AS osztalyKod,
											osztalyok.nev AS osztalyNev, MONTH(datum) AS honap,
											SUM(IF(tetelek.t = szamlak.id, osszeg, -1*osszeg)) AS osszeg
							FROM tetelek' . $gyujtoTabla . '
							LEFT JOIN szamlak ON ( tetelek.t = szamlak.id OR tetelek.k = szamlak.id )
							LEFT JOIN bizonylatok ON tetelek.bizonylat_id = bizonylatok.id
							LEFT JOIN osztalyok ON osztalyok.id = bizonylatok.osztaly_id
		
							LEFT JOIN naplok ON naplok.id = bizonylatok.naplo_id
		
							WHERE (' . $szamlaTartomany . ')
							' . $honap . '
							AND bizonylatok.osztaly_id = osztalyok.id
							AND osztalyok.kod BETWEEN "' . $osztalytol . '" AND "' . $osztalyig . '"
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
		
							AND naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND naplok.ev = '.$this->Session->read('Settings.ev').'
							GROUP BY osztalyId, honap
							ORDER BY osztalyId, honap';
					}
					elseif($type == 'terv'){
						$sql = 'SELECT osztalyok.id AS osztalyId, osztalyok.kod AS osztalyKod,
											osztalyok.nev AS osztalyNev, ho AS honap,
											osszeg
							FROM tervek
							LEFT JOIN osztalyok ON osztalyok.id = tervek.osztaly_id
		
							WHERE riportsor_id = ' . $riportsor['Riportsor']['id'] . '
							' . $honap . '
							AND tervek.osztaly_id = osztalyok.id
							AND osztalyok.kod BETWEEN "' . $osztalytol . '" AND "' . $osztalyig . '"
							AND tervek.ev = '.$this->Session->read('Settings.ev').'
							GROUP BY osztalyId, honap
							ORDER BY osztalyId, honap';
					}
					//debug($sql);
					$beszamoloSorok[$riportsor['Riportsor']['megnevezes']] = $this->Riport->query($sql);
					if(isset($params->elojelforditas))
						$elojelForditas[$riportsor['Riportsor']['megnevezes']] = true;
				}
			}
			//debug($beszamoloSorok);
			/*
			'Bevételek' => array(
				(int) 0 => array(
					'osztalyok' => array(
						'osztalyId' => '262',
						'osztalyKod' => '11'
					),
					(int) 0 => array(
						'honap' => '1',
						'osszeg' => '-5000.00'
					)
				),
				(int) 1 => array(
					'osztalyok' => array(
						'osztalyId' => '262',
						'osztalyKod' => '11'
					),
					(int) 0 => array(
						'honap' => '2',
						'osszeg' => '-189615.00'
					))
					*/
					//$beszamoloSorok szét kéne szedni osztályonként
					/*
					array(
					(osztalyKod) 11 => array(
						'Egyéb bevételek' => array(
							(honap) 1 => (osszeg) 5000,
							(honap) 2 => (osszeg) 189615
				),
			*/			
			foreach($beszamoloSorok as $sorNeve => $adat){
				foreach($adat as $i => $adatCella){
					if($type == 'teny')
						$beszamolo[$adat[$i]['osztalyok']['osztalyKod']][$sorNeve][$adatCella[0]['honap']] = isset($elojelForditas[$sorNeve]) ? (-1*$adatCella[0]['osszeg']) : $adatCella[0]['osszeg'];
					else
						$beszamolo[$adat[$i]['osztalyok']['osztalyKod']][$sorNeve][$adatCella['tervek']['honap']] = $adatCella['tervek']['osszeg'];
				}
			}
			//debug($beszamolo);
			ksort($beszamolo);
			//if($type == 'terv') debug($beszamolo);
			//$this->set('beszamolo', $beszamolo);
			$r['beszamolo'] = $beszamolo;

			$_osztalyok = Hash::combine($beszamoloSorok, '{s}.{n}.osztalyok.osztalyId', '{s}.{n}.osztalyok.osztalyNev', '{s}.{n}.osztalyok.osztalyKod');
			ksort($_osztalyok);
			//debug($_osztalyok);
			/*
			array(
				(int) 11 => array(
					(int) 262 => 'Farm Központ'
				)
			*/
			foreach($_osztalyok as $oKod => $oData){
				foreach($oData as $oId => $oNev)
					$osztalyok[$oKod] = array('id' => $oId, 'nev' => $oNev);
			}
			//debug($osztalyok);
			//$this->set('osztalyok', $osztalyok);
			$r['osztalyok'] = $osztalyok;
			
			return $beszamolo ? $r : false;
		}
	}
	
	public function tenytotal($datum = null){
		$beszamoloRiportId = 2;	//TODO HC
		$riportsorok = $this->Riport->Riportsor->getSorokFor($beszamoloRiportId);	
		//debug($riportsorok);
		/*
		array(
			(int) 0 => array(
				'Riportsor' => array(
					'id' => '60',
					'riport_id' => '2',
					'sorszam' => '1',
					'megnevezes' => 'Bevételek',
					'params' => 's:31:"{"szamlaTartomany" : "9*!982*"}";')),
		*/
		set_time_limit(300);	//5 perc után a webszerver így is úgy is lelövi a folyamatot

		$datum = $this->setDatum($this->request->data['Riport']['datum']);
		$this->set('datum', $datum);

		//elérhető valuták listája
		//TODO: szűrjük ki azokat amiben valóban volt mozgás is
		/*$valutak = $this->Bizonylat->Naplo->Valuta->find('list',
																  array(
																		'fields' => array('Valuta.nev'),
																		'order' => 'Valuta.nev',
																		'recursive' => -1
																		)
																  );*/
		$_valutak = $this->Bizonylat->query('SELECT valutak.id, valutak.nev
														FROM valutak, naplok
														WHERE naplok.valuta_id = valutak.id
														AND naplok.ev = '.$this->Session->read('Settings.ev').'
														AND naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
														GROUP BY valutak.id
														ORDER BY valutak.nev');
		$valutak = array();
		foreach($_valutak as $v){
			$valutak[$v['valutak']['id']] = $v['valutak']['nev'];
		}
		$this->set('valutak', $valutak);
		
		$filter = null;
		//debug($this->request->data['Riport']['valutaNem']);
		if($this->request->data['Riport']['valutaNem']){
			//kiválasztottuk, hogy mely valutát kell kiszűrni
			$filter = ' AND naplok.valuta_id IN (' . implode(',', $this->request->data['Riport']['valutaNem']) . ')';
		}

		foreach($riportsorok as $riportsor){
			$params = json_decode(unserialize($riportsor['Riportsor']['params']));
			if(isset($params->szamlaTartomany)){
				App::uses('SzamlaSzamSQL', 'Utility');
				$szamlaSzamSQL = new SzamlaSzamSQL();
				$szamlaTartomany = $szamlaSzamSQL->createSzamlaTartomanySql($params->szamlaTartomany);

				$sql = 'SELECT * FROM
							(SELECT osztalyok.*
							FROM osztalyok, gyujtok_osztalyok
							WHERE gyujtok_osztalyok.osztaly_id = osztalyok.id
							AND gyujtok_osztalyok.gyujto_id = '.$this->Session->read('Settings.cegId').'
							AND osztalyok.ev = '.$this->Session->read('Settings.ev').') AS oszt

						LEFT JOIN

							(SELECT osztalyok.id as osztId, sum(tetelek.osszeg) as tOsszeg
							FROM osztalyok, gyujtok_osztalyok, bizonylatok, tetelek, szamlak, naplok
							WHERE osztalyok.ev = '.$this->Session->read('Settings.ev').'
							AND gyujtok_osztalyok.osztaly_id = osztalyok.id
							AND gyujtok_osztalyok.gyujto_id = '.$this->Session->read('Settings.cegId').'
							AND bizonylatok.osztaly_id = osztalyok.id
							AND tetelek.bizonylat_id = bizonylatok.id
							AND szamlak.id = tetelek.t
							AND ('.$szamlaTartomany.')
							AND bizonylatok.datum <= "'.$datum.'"
							AND tetelek.spec != "d"
							AND bizonylatok.spec != "d"
							AND naplok.id = bizonylatok.naplo_id
							'.$filter.'
							GROUP BY osztalyok.id) AS tartozik

						ON oszt.id = tartozik.osztId

						LEFT JOIN

							(SELECT osztalyok.id as osztId, sum(tetelek.osszeg) as kOsszeg
							FROM osztalyok, gyujtok_osztalyok, bizonylatok, tetelek, szamlak, naplok
							WHERE osztalyok.ev = '.$this->Session->read('Settings.ev').'
							AND gyujtok_osztalyok.osztaly_id = osztalyok.id
							AND gyujtok_osztalyok.gyujto_id = '.$this->Session->read('Settings.cegId').'
							AND bizonylatok.osztaly_id = osztalyok.id
							AND tetelek.bizonylat_id = bizonylatok.id
							AND szamlak.id = tetelek.k
							AND ('.$szamlaTartomany.')
							AND bizonylatok.datum <= "'.$datum.'"
							AND tetelek.spec != "d"
							AND bizonylatok.spec != "d"
							AND naplok.id = bizonylatok.naplo_id
							'.$filter.'
							GROUP BY osztalyok.id) AS kovetel

						ON oszt.id = kovetel.osztId

					ORDER BY oszt.kod';
				$_tenytotal[$riportsor['Riportsor']['megnevezes']] = $this->Riport->query($sql);
			}
		}

		//debug($_tenytotal);
		foreach($_tenytotal as $oszlop => $tt){
			foreach($tt as $ttt){
				$tenytotal[$oszlop][$ttt['oszt']['id']] = $ttt;
			}
		}
		//debug($tenytotal);
		$this->set('tenytotal', $tenytotal);
		
		//osztály lista
		$osztalyok = $this->getOsztalyok();		
		$osztalyokIgazgatosagonkent = $this->Igazgatosag->getOsztalyokIgazgatosagonkent($osztalyok);
		$igazgatosagok = $this->Igazgatosag->getIgazgatosagok();
		$this->set('osztalyok', $osztalyok);
		$this->set('igazgatosagok', $igazgatosagok);
		$this->set('osztalyokIgazgatosagonkent', $osztalyokIgazgatosagonkent);
	}

	public function tervtotal($datum = null){
		$beszamoloRiportId = 2;	//TODO HC
		$riportsorok = $this->Riport->Riportsor->getSorokFor($beszamoloRiportId);	
		
		$datum = $this->setDatum($this->request->data['Riport']['datum']);
		$this->set('datum', $datum);
		
		$honap = substr($datum, 5, 2);
		
		foreach($riportsorok as $riportsor){
			$params = json_decode(unserialize($riportsor['Riportsor']['params']));
			$rIdk = explode(',', $params->riportSorok);		//4-8,10-20,40
			$riportsorIdk = array();
			foreach($rIdk as $r){
				if(strpos($r, '-')){
					$range = explode('-', $r);
					$range = range($range[0], $range[1]);
					foreach($range as $_r){
						$riportsorIdk[] = $_r;
					}
				}
				else{
					$riportsorIdk[] = $r;
				}
			}
			//debug($riportsorIdk);
			$_tervtotal[$riportsor['Riportsor']['megnevezes']] = $this->Terv->find('all',
									   array(
										'conditions' => array(
															'Terv.ev' => $this->Session->read('Settings.ev'),
															'Terv.ho <=' => $honap,
															'Terv.riportsor_id' => $riportsorIdk),
										'fields' => array('*', 'SUM(Terv.osszeg) AS tOsszeg'),
										'group' => array('Terv.osztaly_id')
										));
		}
		//debug($_tervtotal);
		foreach($_tervtotal as $megnevezes => $tt){
			foreach($tt as $t){
				$tervtotal[$megnevezes][$t['Osztalyok']['id']] = array(
															'osztalyKod' => $t['Osztalyok']['kod'],
															'osztalyNev' => $t['Osztalyok']['nev'],
															'osszeg' => $t[0]['tOsszeg']
															);
			}
		}
		//debug($tervtotal);
		$this->set('tervtotal', $tervtotal);

		//osztály lista
		$osztalyok = $this->getOsztalyok();		
		$osztalyokIgazgatosagonkent = $this->Igazgatosag->getOsztalyokIgazgatosagonkent($osztalyok);
		$igazgatosagok = $this->Igazgatosag->getIgazgatosagok();
		$this->set('osztalyok', $osztalyok);
		$this->set('igazgatosagok', $igazgatosagok);
		$this->set('osztalyokIgazgatosagonkent', $osztalyokIgazgatosagonkent);

	}

	private function setDatum($datum){
		App::uses('EasyDate', 'Utility');
		$easyDate = new EasyDate();
		$easyDate->onErrorReturnCurrentDate = true;
		$datum = $datum ? $easyDate->change($datum) : date('Y-m-d',strtotime('-1 second',strtotime(date('m').'/01/'.date('Y').' 00:00:00')));
		return $datum;
	}
	
	private function getOsztalyok(){
		//osztály lista
		//a joinolt táblában lévő feltétel miatt újra kell a modelleket kötni a szűrt adatok szerint http://teknoid.wordpress.com/2008/08/06/habtm-and-join-trickery-with-cakephp/#
		$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
		$this->Bizonylat->Osztaly->unbindModel($this->Cegosztaly->getunBindArray(array('User')));
		$this->Bizonylat->Osztaly->bindModel($this->Cegosztaly->getBindArray($this->Session->read('Settings.cegId')));
		$osztalyok = $this->Bizonylat->Osztaly->find(
													'all',
													array(
														'fields' => array('id', 'nev', 'kod', 'elkulonitett'),
														'conditions' => array(
																				'ev' => array(0, $this->Session->read('Settings.ev')),
																				'Osztaly.id' => $oIds
																				),
														'order' => array('kod')
														)
													);
		return $osztalyok;
	}
	
	function tenyexport(){
		if(!empty($this->request->data) && is_uploaded_file($this->request->data['Riport']['File']['tmp_name'])){	//az is_uploaded_file biztosítja, hogy ne lehessen külső fájlokat feltölteni a webről
			if($this->request->data['Riport']['File']['type'] == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'){	//excel file
				if($this->request->data['Riport']['hoig']){
					set_time_limit(300);
					$this->set('teny', $this->_beszamolo('teny'));
				}
			}
			else{
				throw new NotImplementedException('A kiválaszott file nem xlsx file: ' . $file['type']);
			}
		}
	}
}